import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Tp3_Exacto {

	public static void main(String[] args) {
		String nombreArchivo = "Tp3";
		
		String archivoEntrada = ".\\resources\\" + nombreArchivo + ".in";
		String archivoSalida = ".\\resources\\" + nombreArchivo + "Exacto.out";
		String archivoTiempos = ".\\resources\\" + nombreArchivo + "Exacto.time";
		
		algoritmo(archivoEntrada, archivoSalida, archivoTiempos);
		
	}
	
	public static void algoritmo(String archivoEntrada, String archivoSalida, String archivoTiempos) {
		FileParser fp = new FileParser(archivoEntrada);
		FileWriter fw = new FileWriter(archivoSalida);
		//FileWriter fwTiempos = new FileWriter(archivoTiempos);
		Set<Integer> res = new HashSet<Integer>();
		
		//int cantidadRepeticiones=5;
		//long minMedicion=0;
		
		while (!fp.getLine().trim().equals("-1")) {
			Grafo instancia = parsearInstancia(fp);
			//for (int rep=0 ;rep<cantidadRepeticiones;rep++) {
				//long tiempoInicio = System.nanoTime();
				res = maxClique(instancia);
				//long totalTiempo = System.nanoTime()- tiempoInicio;
				//minMedicion+=totalTiempo;
			//}
			//minMedicion /= cantidadRepeticiones;
			//fwTiempos.writeLine("EXACTO;" + instancia.getCantVertices() + ";" + String.valueOf(minMedicion) + ";" + res.size());
			
			fw.writeLine(String.valueOf(res.size()));
			StringBuffer str = new StringBuffer();
			Iterator<Integer> it = res.iterator();
			str.append("N");
			while (it.hasNext()) {
				str.append(" " + it.next());
			}
			fw.writeLine(str.toString());
		}
		
		fw.closeFile();
		fp.closeFile();
		//fwTiempos.closeFile();
	}
	
	private static Grafo parsearInstancia(FileParser fp) {
		String[] str = fp.getLine().trim().replaceAll("\\s+", " ").split("\\s");
		
		Integer cantVertices = Integer.parseInt(str[0]);
		Grafo g = new Grafo(cantVertices);
		
		fp.nextLine();
		
		int i = 1;
		while (i <= cantVertices) {
			String[] str2 = fp.getLine().trim().replaceAll("\\s+", " ").split("\\s");
			int cantAdyacentes = Integer.parseInt(str2[0]);
			
			int j = 1;
			while (j <= cantAdyacentes) {
				g.agregaEje(i, Integer.parseInt(str2[j]));
				j++;
			}
			
			fp.nextLine();
			i++;
		}
		
		return g;
	}
	
	private static Set<Integer> maxClique(Grafo g) {
		Set<Integer> res = new HashSet<Integer>();
		
		Set<Integer> r = new HashSet<Integer>();
		Set<Integer> p = new HashSet<Integer>();
		Set<Integer> x = new HashSet<Integer>();
		
		for (int i=1;i<=g.getCantVertices();i++) {
			p.add(i);
		}
		
		bk(r, p, x, g, res);
		
		return res;
	}
	
	private static Set<Integer> bk(Set<Integer> r, Set<Integer> p, Set<Integer> x, Grafo g, Set<Integer> res) {
		
		if (p.isEmpty() && x.isEmpty()) {
			return r;
		} else {
			Set<Integer> px = new HashSet<Integer>();
			px.addAll(p);
			px.addAll(x);
			
			Iterator<Integer> it = px.iterator();
			Integer u = it.next();
			Set<Integer> vecinosU = g.obtengoVecinos(u);
			Set<Integer> c = new HashSet<Integer>();
			c.addAll(p);
			c.removeAll(vecinosU);
			for (Integer v:c){
				Set<Integer> vecinosV = g.obtengoVecinos(v);
				Set<Integer> r2 = new HashSet<Integer>();
				r2.addAll(r);
				Set<Integer> p2 = new HashSet<Integer>();
				p2.addAll(p);
				Set<Integer> x2 = new HashSet<Integer>();
				x2.addAll(x);
				
				r2.add(v);
				p2.retainAll(vecinosV);
				x2.retainAll(vecinosV);
				
				if (r2.size()>res.size()) {
					res.clear();
					res.addAll(r2);
				}
				
				bk(r2, p2, x2, g, res);
				
				p.remove(v);
				x.add(v);
			}
		}
		
		return res;
	}
	
}
